using System.Collections.Generic;
using SIP.PN.DAO.Interfaces;
using SIP.PN.Filtros.Interfaces;
using SIP.PN.Modelo.Entidades;
using SIP.PN.Servicios.Interfaces;
using SIP.PN.Servicios.Interfaces.DTO;
using SIP.PN.Servicios.Interfaces.Excepciones;

namespace SIP.PN.Servicios
{
    public class ServicioTarea : Servicio, IServicioTarea
    {
        #region Daos

        private IDaoEspecialidad daoEspecialidad;
        public IDaoEspecialidad DaoEspecialidad
        {
            get { return daoEspecialidad; }
            set { daoEspecialidad = value; }
        }

        private IDaoTarea daoTarea;
        public IDaoTarea DaoTarea
        {
            get { return daoTarea; }
            set { daoTarea = value; }
        }

        private IServicioAplicacion srvAplicacion;
        public IServicioAplicacion SrvAplicacion
        {
            get { return srvAplicacion; }
            set { srvAplicacion = value; }
        }

        #endregion

        #region Tarea

        public IList<TareaDTO> Listar(string orden, int desde, int cantidad, string codigo, string nombre, string especialidad)
        {
            IList<TareaDTO> r = new List<TareaDTO>();

            IFiltroTarea filtro = ObtenerFiltro <IFiltroTarea>();
            filtro.Cantidad = cantidad;
            filtro.Desde = desde;
            
            if (!string.IsNullOrEmpty(orden))
            {
                if (orden.EndsWith(" DESC"))
                {
                    filtro.AgregarOrden(orden.Substring(0, orden.Length - 5), false);
                }
                else
                {
                    filtro.AgregarOrden(orden, true);
                }
            }

            filtro.Codigo = codigo;
            filtro.Nombre = nombre;
            if (!string.IsNullOrEmpty(especialidad))
            {
                Especialidad e = new Especialidad();
                e.Codigo = especialidad;
                filtro.Especialidad = e;
            }

            foreach (Tarea item in DaoTarea.Listar(filtro))
            {
                r.Add(ConvertToDTO(item));
            }
            return r;
        }

        public int ObtenerCantidadRegistros(string codigo, string nombre, string especialidad)
        {
            IFiltroTarea filtro = ObtenerFiltro<IFiltroTarea>();
            filtro.Codigo = codigo;
            filtro.Nombre = nombre;
            
            if (!string.IsNullOrEmpty(especialidad))
            {
                Especialidad e = new Especialidad();
                e.Codigo = especialidad;
                filtro.Especialidad = e;
            }

            return DaoTarea.ObtenerCantidadRegistros(filtro);
        }

        public TareaDTO Obtener(string codigo)
        {
            return ConvertToDTO(DaoTarea.Obtener(codigo));
        }

        public virtual void Crear(string codigo, string nombre, string descripcion, string codigoEspecialidad)
        {
            if (Obtener(codigo)!=null)
                throw new ExcepcionCodigoUtilizado();

            Especialidad especialidad = DaoEspecialidad.Obtener(codigoEspecialidad);
            if (especialidad == null)
                throw new ExcepcionOtra("No existe la especialidad");

            Tarea entidad = new Tarea();
            entidad.Codigo = codigo;
            entidad.Nombre = nombre;
            entidad.Descripcion = descripcion;
            entidad.Especialidad = especialidad;

            DaoTarea.Guardar(entidad);
        }

        public virtual void Modificar(string codigo, string nombre, string descripcion, string codigoEspecialidad)
        {
            Tarea entidad = DaoTarea.Obtener(codigo);
            if (entidad == null)
                throw new ExcepcionOtra("No existe la tarea");

            Especialidad especialidad = DaoEspecialidad.Obtener(codigoEspecialidad);
            if (especialidad == null)
                throw new ExcepcionOtra("No existe la especialidad");

            entidad.Nombre = nombre;
            entidad.Descripcion = descripcion;
            entidad.Especialidad = especialidad;

            DaoTarea.Guardar(entidad);
        }

        public virtual void Eliminar(string codigo)
        {
            Tarea entidad = DaoTarea.Obtener(codigo);
            if (entidad==null)
                throw new ExcepcionOtra("No existe la tarea.");
            DaoTarea.Eliminar(entidad);
        }

        #endregion
    }
}
